/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "stdafx.h"
#include "粒子.h"

#include "intern/VK粒子.h"

#include "物理/物理.h"



S_粒子系统配置* f_create粒子系统(uint32 pnum, S_设备环境 ctx, E_粒子绘制类型 type) {
	S_粒子系统配置* psys = (S_粒子系统配置*)malloc(sizeof(S_粒子系统配置));
	(*psys) = { 0 };

	psys->m_绘制类型 = type;

	switch (psys->m_绘制类型) {
		case E_粒子绘制类型::E_粒子物体_点:
			f_createVk点绘制粒子(psys, pnum, ctx);
			break;

		default:
			break;
	}
	
	//psys->m_Vel
	psys->m_发射粒子ID偏移 = 0;

	return psys;
}

void f_set粒子数量(S_粒子系统配置* psys, uint32 num) {
	switch (psys->m_绘制类型)
	{
	case E_粒子绘制类型::E_粒子物体_点:
		f_buf_resize((S_板载缓存*)psys->m_Loc, num);
		f_buf_resize((S_板载缓存*)psys->m_Vel, num);
		f_buf_resize((S_板载缓存*)psys->m_Size, num);
		break;
	case E_粒子绘制类型::E_粒子物体_网格:
		
		break;
	case E_粒子绘制类型::E_粒子物体_网格集合:
		
		break;

	case E_粒子绘制类型::E_粒子物体_物理后端映射:
		if (psys->m_物理属性) {
			f_Phy_设置粒子数量((S_物理解算器*)(psys->m_物理引擎), psys->m_物理属性, num);
		}
		break;

	default:
		break;
	}

	psys->m_Count = num;

	

}

void f_设置粒子发射器(S_粒子系统配置* psys)
{
}

void f_set粒子寿命(S_粒子系统配置* psys)
{
}

void f_step粒子系统(S_粒子系统配置* psys)
{
}

void f_set物理类型(S_粒子系统配置* psys, S_结构对象指针 物理引擎, E_物理体类型 type) {
	psys->m_物理引擎 = 物理引擎;


}

void f_set绘制类型(S_粒子系统配置* psys, E_粒子绘制类型 type) {
	if (psys->m_绘制类型 != type) {
		switch (type)
		{
			case E_粒子绘制类型::E_粒子物体_点:
				f_createVk点绘制粒子(psys, psys->m_Count, psys->m_Ctx);
				break;
			case E_粒子绘制类型::E_粒子物体_网格:
				f_createVk实例物体绘制粒子(psys, psys->m_Count, psys->m_Ctx);
				break;
			case E_粒子绘制类型::E_粒子物体_网格集合:
				f_createVk实例物体绘制粒子(psys, psys->m_Count, psys->m_Ctx);
				break;

			case E_粒子绘制类型::E_粒子物体_物理后端映射:
				if (psys->m_物理属性) {
					f_Phy_设置粒子数量((S_物理解算器*)(psys->m_物理引擎), psys->m_物理属性, psys->m_Count);
				}
				break;

			default:
				break;
		}
		//psys->m_Loc->
	}
}

void f_draw粒子(S_粒子系统配置* psys, S_渲染参数& 渲染参数) {
	//std::vector<S_板载缓存*> bg(2);
	//bg[0] = (S_板载缓存*)psys->m_Loc;
	//bg[1] = (S_板载缓存*)psys->m_Vel;

	//f_Draw_序列(psys->m_Ctx, psys->m_Material, (S_板载缓存*)psys->m_Loc, 渲染参数);
}








void f_set粒子位置(S_粒子系统配置* psys, const vec3* l, uint32 num) {
	num = uint32(DEF_Min(num, ((S_板载缓存*)psys->m_Loc)->m_Size));
	f_copy板载缓存array((S_板载缓存*)psys->m_Loc, 0, l, num);
	f_copy板载缓存array((S_板载缓存*)psys->m_Vel, 0, l, num);
}

void f_set粒子速度(S_粒子系统配置* psys, const vec3* v, uint32 num) {
	num = uint32(DEF_Min(num, ((S_板载缓存*)psys->m_Vel)->m_Size));
	f_copy板载缓存array((S_板载缓存*)psys->m_Vel, v, num);
}

void f_set粒子旋转(S_粒子系统配置* psys, const vec3* r, uint32 num) {
	num = uint32(DEF_Min(num, ((S_板载缓存*)psys->m_Rot)->m_Size));
	f_copy板载缓存array((S_板载缓存*)psys->m_Rot, r, num);
}

void f_set粒子大小(S_粒子系统配置* psys, const vec3* s, uint32 num) {
	num = uint32(DEF_Min(num, ((S_板载缓存*)psys->m_Size)->m_Size));
	f_copy板载缓存array((S_板载缓存*)psys->m_Size, s, num);
}

void f_particle_set粒子单方向力(S_粒子系统配置* psys, const vec3& s) {
	f_施加力((S_物理解算器*)(psys->m_物理引擎), psys->m_物理属性, s, E_物理引擎::E_物理引擎_PBF);
}







void f_particle_copy坐标(S_粒子系统配置* psys, vec3* c) {
	switch (psys->m_绘制类型) {
		case E_粒子绘制类型::E_粒子物体_点:
			break;
		case E_粒子绘制类型::E_粒子物体_网格:
			break;
		case E_粒子绘制类型::E_粒子物体_网格集合:
			break;

		case E_粒子绘制类型::E_粒子物体_物理后端映射:
			if (psys->m_物理属性) {
				f_Phy_拷贝粒子坐标((S_物理解算器*)psys->m_物理引擎, psys->m_物理属性, c, E_物理引擎::E_物理引擎_PBF);
				
			}
			break;

		default:
			break;
	}
}

void f_particle_copy速度(S_粒子系统配置* psys, vec3* v) {
	
}




void f_particle_设置物理属性(S_粒子系统配置* psys, S_物理体* body) {
	psys->m_物理属性 = body;
}

bool f_particle_map物理引擎(S_粒子系统配置* psys) {
	switch (psys->m_绘制类型) {
		case E_粒子绘制类型::E_粒子物体_点:
			break;
		case E_粒子绘制类型::E_粒子物体_网格:
			break;
		case E_粒子绘制类型::E_粒子物体_网格集合:
			break;

		case E_粒子绘制类型::E_粒子物体_物理后端映射:
			if (psys->m_物理属性) {
				psys->m_Loc = (S_结构对象指针)f_Phy_映射粒子坐标((S_物理解算器*)psys->m_物理引擎, psys->m_物理属性);
				psys->m_Vel = (S_结构对象指针)f_Phy_映射粒子速度((S_物理解算器*)psys->m_物理引擎, psys->m_物理属性);
				psys->m_外力 = (S_结构对象指针)f_Phy_映射粒子外力((S_物理解算器*)psys->m_物理引擎, psys->m_物理属性);
			}
			return true;

		default:
			break;
	}

	return false;
}








vec3* f_particle_map坐标(S_粒子系统配置* psys, S_物理体* body) {
	return nullptr;
}

vec3* f_particle_map速度(S_粒子系统配置* psys, S_物理体* body) {
	return nullptr;
}













